package syg._05_activiti_definition;

import org.activiti.engine.HistoryService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricActivityInstanceQuery;
import org.activiti.engine.repository.ProcessDefinition;
import org.junit.Test;

import java.util.List;

public class _01_Definition {

    /**
     * 查询流程定义信息
     */
    @Test
    public void test1() {
        // 1,获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2,因为我们要获取流程定义信息,而流程定义信息属于资源,故而我们需要获取RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3,查询出所有的定义信息(根据流程定义的key,查出来是个list,是因为部署了多次,那为什么要部署多次呢？)
        List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
                // 根据流程定义的key,查询流程定义的信息
                .processDefinitionKey("myEvection")
                // 按照版本号排序
                .orderByProcessDefinitionVersion()
                // 倒序
                .desc()
                // 返回结果集
                .list();
        for (ProcessDefinition definition : list) {
            System.out.println("流程定义id=" + definition.getId());
            System.out.println("流程定义的部署id=" + definition.getDeploymentId());
            System.out.println("流程定义的名字=" + definition.getName());
            System.out.println("流程定义的版本号=" + definition.getVersion());
            System.out.println(definition.getEngineVersion());
            System.out.println(definition.getAppVersion());

        }
    }

    /**
     * 删除流程部署信息
     * act_ge_bytearray
     * act_hi_actinst
     * act_hi_procinst
     * act_hi_taskinst
     * act_re_deployment
     * act_re_procdef
     * act_ru_execution
     * act_ru_task
     * 删除部署信息时,会将部署信息、流程定义信息、执行结束的流程的历史信息、执行结束的任务的历史信息、当前正在执行的流程信息、当前正在执行的任务信息 全部删除！！！！
     */
    @Test
    public void test2() {
        // 1,获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2,因为我们要获取流程部署信息,而流程部署信息属于资源,故而我们需要获取RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3,通过部署id,删除部署信息(查询流程定义信息时,可以获取部署id)
        String deploymentId = "17501";
        // 有外键时,默认不允许级联删除,true:表示允许级联删除
        repositoryService.deleteDeployment(deploymentId, true);
    }

    /**
     * 查询轨迹
     */
    @Test
    public void test3() {
        // 1,获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2,因为我们要获取轨迹(即历史信息,看流程处理到哪一个任务了),所以我们需要获取HistoryService
        HistoryService historyService = processEngine.getHistoryService();
        // 3,获取表act_hi_actinst的查询对象
        HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
        // 4,查询表act_hi_actinst
        instanceQuery.processInstanceId("30001");
        // 排序等操作(怎么实现的？)
        instanceQuery.orderByHistoricActivityInstanceStartTime();
        instanceQuery.desc();
        // 5,查询所有内容
        List<HistoricActivityInstance> list = instanceQuery.list();
        // 6,遍历
        for (HistoricActivityInstance instance : list) {
            System.out.println("任务定义的key(表act_hi_taskinst中的TASK_DEF_KEY_)=" + instance.getActivityId());
            System.out.println("任务的名字=" + instance.getActivityName());
            System.out.println("任务类型=" + instance.getActivityType());
            System.out.println("任务id(表act_hi_taskinst中的id字段)=" + instance.getTaskId());
            System.out.println("流程实例id(表act_hi_procinst中的id字段)=" + instance.getProcessInstanceId());
            System.out.println("流程定义id(表act_re_procdef中的id字段)=" + instance.getProcessDefinitionId());
            System.out.println("任务负责人=" + instance.getAssignee());

            System.out.println("=========================我是分隔符=========================");
        }
    }
}
